gitHub上传问题
问题
第一次将代码上传到gitHub时系统提示出错。
解决办法
设置Git.
1. 打开GitBash,如下图一所示:
敲入如下命令。
gitconfig--globaluser.name"myname"
git config --global user.email "[email protected]"
Test2LogCat
问题
LogCat 一直无法显示。
解决办法
添加按钮,通过按钮添加点击事件,如图二:
相关知识点
- Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用.
- logcat 命令来查看系统日志缓冲区的内容: [adb] logcat [] ... [] ...请查看Listing of logcat Command Options ,它对logcat命令有详细的描述 .也可以在电脑或运行在模拟器/设备上的远程adb shell端来使用logcat命令,也可以在电脑上查看日志输出。
- logcat过滤日志输出每一个输出的Android日志信息都有一个标签和它的优先级. 日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签). 优先级有下列集中,是按照从低到高顺利排列的:
- V — Verbose (lowest priority)
- D — Debug
- I — Info
- W — Warning
- E — Error
- F — Fatal
- S — Silent (highest priority, on which nothing is ever printed)
在运行logcat的时候在前两列的信息中可以看到logcat的标签列表和优先级别,它是这样标出的:/.
Test3常用组件
问题
- TestView中文字过长影响界面效果。
- 界面下方两个按钮长度不一,影响美观。
解决办法
- 修改TestView中句子的长度。
- 利用Button中layout-weight属性,将属性设置为1。效果图如图
相关知识点
Android中常用的五大布局方式有以下几种:
* 线性布局(LinearLayout):按照垂直或者水平方向布局的组件。
* 帧布局(FrameLayout):组件从屏幕左上方布局组件。
* 表格布局(TableLayout):按照行列方式布局组件。
* 相对布局(RelativeLayout):相对其他组件的布局方式。
* 绝对布局(AbsoluteLayout):按照绝对坐标来布局组件。
Test6菜单
问题
1.弹出菜单无法响应。
2.上下文菜单没有响应。
解决办法
- 查看代码,最后发现是布局中TestView没有添加onClick属性。添加后问题解决。2.上下文菜单没有注册,注册后问题解决。
相关知识点
菜单的创建方法
- 动态创建通过重写Activity中的onCreateOptionMenu方法来创建菜单,一般使用menu.add("选项名")为添加一个菜单选项,menu.getItem(int itemIndex)则是根据选项的索引获取该菜单选项,并对其进行操作,比如添加点击事件onMenuItemClickListener,用addSubMenu添加子菜单等。
- 通过XML资源文件创建可以通过menu文件夹下的menu.xml创建菜单的样式,然后利用getMenuInflater().inflate(menuRes.,menu)将创建的菜单样式inflate到程序中。大体主要分三步:
- 建立XML资源文件:menu.xml文件一般的定义方式如图片四:
- 在onCreateOptionMenu回调函数完成XML资源的infate,把菜单资源文件压入到程序中,不同彩带使用不同的回调函数,比如ContextMenu使用onCreateContextMenu,如图片五:
- 如果我们需要给菜单添加点击事件,一般我们通过重写onMenuItemSelected来设置,不同菜单使用不同的点击回调函数,比如ContextMenu使用onContextItemSelected,如图片六:
Test7对话框
问题
登录按钮无法登录。
解决办法
获取两个editText产生问题,修改由图片:
变为:
相关知识点
android自定义对话框使用方法
在android项目中为了美化外观,不会直接使用系统对话框,因此会自定义自己样式的自定义对话框,而自定义对话框也是非常简单的,具体使用方法如下。
1. 首先在XML中讲View视图显示出来,因为是自定义对话框,所以样式可以自己设定。
2. 然后只需在创建的Activity种使用AlertDialog创建对话框并获取对话框内容显示出来。
Test8Activity的生命周期
问题
整体响应速度缓慢。
解决办法
多次启动。
相关知识点
Activity的生命周期如图片:
启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
Test12Fragmentmy20
问题
系统报错。
解决办法
根据Android Studio提示发现是Java包倒错,以及DetailFragment.java缺少OnFragmentInteractionListener接口。
改善后如图:
相关知识点
Fragment生命周期函数:
* onAttach(Context) –
>
当fragment被绑定到activity上时回调
* onCreate(Bundle) –
>
当fragment对象创建的时候回调,一般在此方法里做参数接收。
* onCreateView(LayoutInflater, ViewGroup, Bundle) –
>
创建fragment视图时回调
* onDestoryView –
>
视图销毁时回调
* onDestory –
>
销毁fragment时回调
* onDetech() –
>
fragment与activity失去关联时回调
Fragment的使用
使用fragment可以当成一个控件,直接放到activity布局文件里;也可以在代码里面动态的添加、更新或者删除。
Test13横屏和竖屏
问题
- 在横竖屏之间切换,由于横竖屏的高宽会发生转换,会要求不同的布局。
解决办法
- 在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的main_large,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序为调用Activity的onCreate方法,从而加载相应的布局。如图所示:
相关知识点
如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下两种方法来切换布局:
1. 在res目录下建立layout-land和layout-port目录,相应的layout文件名不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,横竖屏切换时程序为调用Activity的onCreate方法,从而加载相应的布局。
2. 假如布局资源不按照如上设置,则可以通过java代码来判断当前是横屏还是竖屏然后来加载相应的xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来检查当前的方向,然后可以让你的setContentView来载入不同的layout xml。代码见图片二十:
Test14使用Intent隐式启动
问题
无法启动第二个Activity。
解决办法
上网查阅资料。错误原因是只单纯在AndroidManifest配置了activity的action属性,应该同时匹配action类别,category类别和data类别才可。并且category android:name="android.intent.category.DEFAULT"是必须的。如图片二十二:
相关知识点
- 隐式启动不需要致命需要启动哪一个Activity,而由Android系统来决定,这样有利于降低组件之间的耦合度。
- 隐式启动Activity时,Android系统会在程序运行时解析Intent,并根据一定的规则对Intent和Activity进行匹配,使Intent上的动作、数据与Activity完全吻合。匹配的组件可以是程序本身的Activity,也可以是Android系统内置的Activity,还可以是第三方应用程序提供的Activity。
- 程序开发人员可以将浏览动作和Web地址作为参数传递给Intent,Android系统则通过匹配动作和数据格式,找到最适合于此动作和数据格式的组件。
Test15使用Intent打电话
问题
没有对电话号码进行验证。
解决办法
通过Intent对象,带入"ACTION_CALL"这个关键词。代码如图:
相关知识点
通过自定义的Intent对象,带入"ACTION_CALL"这个关键,以及通过Uri.parse()的方法将用户输入号码(Data)带入,最后以startActivity()方法,将自定义的Intent传入。
Test16IntentFilter
相关知识点
Android操作系统使用过滤器来查明活动,服务和广播接收器能够处理制定的一组动作,类别。使用
<
intent-filter
>
元素在manifest文件中,列出了动作,类别和数据类型相关联的活动,服务或广播接收器。
Test19外部存储文件
问题
无法写入读取文件。
解决办法
没有在AndroidManifest.xml中配置SD卡访问权限。添加如图片二十四的代码:
相关知识点
我们在使用SDcard进行读写的时候 会用到Environment类下面的几个静态方法
1. getDataDirectory() 获取到Androi中的data数据目录
2.getDownloadCacheDirectory() 获取到下载的缓存目录
3. getExternalStorageDirectory() 获取到外部存储的目录 一般指SDcard
4. getExternalStorageState() 获取外部设置的当前状态 一般指SDcard,android系统中对于外部设置的状态,我们比较常用的应该是 MEDIA_MOUNTED(SDcard存在并且可以进行读写MEDIA_MOUNTED_READ_ONLY (SDcard存在,只可以进行读操作) 当然还有其他的一些状态,可以在文档中进行查找到。 5. getRootDirectory() 获取到Android Root路径
6. isExternalStorageEmulated() 返回Boolean值判断外部设置是否有效。
7.isExternalStorageRemovable() 返回Boolean值,判断外部设置是否可以移除。
Test21ContentProvider
问题
R突然变红报错无法运行。
解决办法
查看XML文件,发现有书写问题。
相关知识点
android中对数据操作包含有:
file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。
android中提供ContectResolver与ContentProvider来操作别的应用程序的数据。
一个应用实现ContentProvider来提供内容给别的应用来操作,
一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。
Test22访问联系人
问题
无法读写联系人。
解决办法
没有设置必须设置读或写的权限。代码如图:
相关知识点
- Android系统中的联系人也是通过ContentProvider来对外提供数据的
- 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db
- 我们需要关注的有3张表: raw_contacts:其中保存了联系人id data:和raw_contacts是多对一的关系,保存了联系人的各项数据 mimetypes:为数据类型
- Provider的authorites为com.android.contacts
- 查询raw_contacts表的路径为:contacts
- 查询data表的路径为:contacts/#/data.这个路径为连接查询,要查询“mimetype”字段可以根据“mimetype_id”查询到mimetypes表中的数据
- 先查询raw_contacts得到每个联系人的id,在使用id从data表中查询对应数据,根据mimetype分类数据
Test23ContentObserver
问题
使用Logcat无法及时响应。
解决办法
修改为Toast打印提示信息。如图,显示的是增加联系人:
相关知识点
1.在ContentProvider类的insert\update\delete方法加入this.getContext().getContentResolver().notifyChange(URI,null);
其中URI表示监听的URI
null表示发送消息给任何人;
2.在访问者的类中调用如下方法:
context.getContentResolver().registerContentObserver(uri,true,newContentObserver(newHandler()));
3.创建内部类继承ContentObserver并重写下面两个方法:
(1)带有Handler的构造函数;
(2)public void onChange(boolean selfChange); 此函数在内容提供者发出改变信号时就会被调用
。参数selfChange为如果是自己改变的原因,则为true;如果不是自己改变的,则为false;例如实例图